home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / dtool.c < prev    next >
C/C++ Source or Header  |  1999-09-28  |  12KB  |  658 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     ユーティリティなど
  5. */
  6.  
  7. #include    "dsh.h"
  8.  
  9. static void w_wait2_sub(int);
  10. static void w_wait2_prt(int);
  11. static void ASK_Window_Close(void);
  12.  
  13.  
  14.  
  15.  
  16. /*
  17.  *--------------------------------------
  18.  *    仮想マウスの状態チェック
  19.  *--------------------------------------
  20.  */
  21.  
  22.  
  23. void 
  24. dmsstat(int *ax, int *ay, int *abl, int *abr)
  25. {
  26.     int dbl = 0, dbr = 0;
  27.  
  28.     /*
  29.      *    とりあえず初期化
  30.      */
  31.     *abl = 0;
  32.     *abr = 0;
  33.  
  34.  
  35.     /*
  36.      *    ここは、ジョイスティックのボタンを読み取る
  37.      *    ジョイスティックのボタン読み込みは、ジョイカードでの使用を想定しています。
  38.      *    よって上下スクロールの時のボタン左右がマウスと逆の場合があります。
  39.      */
  40.     if (Jflg) {
  41.         switch (strig(1)) {
  42.         case 1:
  43.             *abl = 0;
  44.             *abr = -1;
  45.             break;
  46.         case 2:
  47.             *abl = -1;
  48.             *abr = 0;
  49.             break;
  50.         case 3:
  51.             *abl = -1;
  52.             *abr = -1;
  53.             break;
  54.         }
  55.     }
  56.  
  57.     if (Kflg) {
  58.         /*
  59.          *    キーボードのROLL UP/ROLL DOWNを読む
  60.          *    最初はXF1/XF2でしたけど、カーソルキーに近いこともあり
  61.          *    片手で操作しやすいのでU/Dにかえました
  62.          */
  63.         switch (BITSNS(0x07)) {
  64.         case 0x01:
  65.             *abl = -1;
  66.             *abr = 0;
  67.             break;    /*    R_up    */
  68.         case 0x02:
  69.             *abl = 0;
  70.             *abr = -1;
  71.             break;    /*    R_down    */
  72.         case 0x03:
  73.             *abl = -1;
  74.             *abr = -1;
  75.             break;    /*    u+d    */
  76.         }
  77.  
  78.         /*
  79.          *    やっぱりXF1/XF2でも操作(上下スクロール・復帰)出来るようにしました
  80.          */
  81.         switch (BITSNS(0x0A)) {
  82.         case 0x20:
  83.             *abl = -1;
  84.             *abr = 0;
  85.             break;    /*    XF1    */
  86.         case 0x40:
  87.             *abl = 0;
  88.             *abr = -1;
  89.             break;    /*    XF2    */
  90.         case 0x60:
  91.             *abl = -1;
  92.             *abr = -1;
  93.             break;    /*    X1+X2    */
  94.         }
  95.  
  96.         /*
  97.          *    ESCで復帰出来るようにする
  98.          */
  99.         if (esc_on()) {
  100.             *abl = -1;
  101.             *abr = -1;
  102.         }
  103.         /*
  104.          *    リターンキーで決定出来るようにする
  105.          */
  106.         if (cr_on() || enter_on()) {
  107.             *abl = -1;
  108.             *abr = 0;
  109.         }
  110.     }
  111.     /*
  112.      *    マウスのボタン読み取り
  113.      */
  114.     msstat(ax, ay, &dbl, &dbr);
  115.     if (dbl || dbr) {
  116.         *abl = dbl;
  117.         *abr = dbr;
  118.     }
  119. }
  120.  
  121. /*
  122.  *------------------------------------------------------
  123.  *    仮想マウスでのマウスカーソルの位置を調べる
  124.  *------------------------------------------------------
  125.  */
  126.  
  127.  
  128. void 
  129. dmspos(int *mx, int *my)
  130. {
  131.     int ax = 0, ay = 0;
  132.     int dest = 0;
  133.  
  134.     /*
  135.      *    カーソルの移動速度の決定
  136.      */
  137.     if (Jflg || Kflg) {
  138.         dest = NOMAL_SPEED + (CSpdUp * 2);        /* カーソルの速度標準 */
  139.         if (opt1_on() || shift_on()) {
  140.             dest = HIGH_SPEED + (CSpdUp * 2);    /* 速度3倍 */
  141.         }
  142.     }
  143.     /*
  144.      *    ここは、ジョイスティックのレバーを読み取る
  145.      */
  146.     if (Jflg) {
  147.         switch (stick(1)) {
  148.         case 1:
  149.             ax = -dest;
  150.             ay = dest;
  151.             break;
  152.         case 2:
  153.             ay = dest;
  154.             break;
  155.         case 3:
  156.             ax = dest;
  157.             ay = dest;
  158.             break;
  159.         case 4:
  160.             ax = -dest;
  161.             break;
  162.         case 5:
  163.             break;
  164.         case 6:
  165.             ax = dest;
  166.             break;
  167.         case 7:
  168.             ax = -dest;
  169.             ay = -dest;
  170.             break;
  171.         case 8:
  172.             ay = -dest;
  173.             break;
  174.         case 9:
  175.             ax = dest;
  176.             ay = -dest;
  177.             break;
  178.         }
  179.     }
  180.     /*
  181.      *    ここは、テンキーを読み取る
  182.      *    というのがあったのですが、死ぬほど遅く動き(カーソル)もがたがたなので
  183.      *    とっぱらいました。
  184.      */
  185.  
  186.     /*
  187.      *    カーソルキーの読み取り
  188.      */
  189.     if (Kflg) {
  190.         switch (BITSNS(7)) {
  191.         case 0x08:
  192.             ax = -dest;
  193.             break;    /*    ←    */
  194.         case 0x10:
  195.             ay = -dest;
  196.             break;    /*    ↑    */
  197.         case 0x20:
  198.             ax = dest;
  199.             break;    /*    →    */
  200.         case 0x40:
  201.             ay = dest;
  202.             break;    /*    ↓    */
  203.  
  204.         case 0x18:
  205.             ax = -dest;
  206.             ay = -dest;
  207.             break;    /*    ←↑    */
  208.         case 0x30:
  209.             ax = dest;
  210.             ay = -dest;
  211.             break;    /*    ↑→    */
  212.         case 0x48:
  213.             ax = -dest;
  214.             ay = dest;
  215.             break;    /*    ←↓    */
  216.         case 0x60:
  217.             ax = dest;
  218.             ay = dest;
  219.             break;    /*    ↓→    */
  220.         }
  221.     }
  222.     /*
  223.      *    仮想マウスの本体
  224.      */
  225.     mspos(mx, my);        /*    本来のマウスカーソルの座標    */
  226.  
  227.     if (ax || ay) {
  228.     /*
  229.         ジョイスティックやキーボードの入力があれば
  230.         本来のマウスカーソルの位置に、下駄をはかせて
  231.         マウスカーソルを再表示する。
  232.     */
  233.         ax += *mx;
  234.         ay += *my;
  235.         if (ax < 0)
  236.             ax = 0;
  237.         if (ay < 0)
  238.             ay = 0;
  239.         setmspos(*mx = ax, *my = ay);
  240.     }
  241. }
  242.  
  243.  
  244. /*    ジョイスティック=マウスの使用モード(フラグ)ON/OFF切り替え    */
  245.  
  246. void
  247. JoyMouseSwitch()
  248. {
  249.     Jflg = !Jflg;
  250. }
  251.  
  252. /*    キーボード=マウスの使用モード(フラグ)ON/OFF切り替え    */
  253.  
  254. void
  255. KeyMouseSwitch()
  256. {
  257.     Kflg = !Kflg;
  258. }
  259.  
  260. /*    キーボード・ジョイスティックマウスのカーソルの基準速度切り替え */
  261.  
  262. void
  263. CSpdUpSwitch()
  264. {
  265.     CSpdUp = !CSpdUp;
  266. }
  267.  
  268. /*
  269.     起動時、ジョイスティックから信号が来ているか
  270.     チェックする (JoystickMouse On だと画面が勝手に
  271.     スクロールするなどの症状が出るため)
  272. */
  273. void 
  274. check_joystick()
  275. {
  276.     if (!Jflg) {
  277.         return;
  278.     }
  279.  
  280.     if (JOYGET(0) != 0xff) {
  281.         B_PRINT("ジョイスティック1の状態を確認して下さい\n(SPACEキー:ジョイスティックを使わないモードで起動)\r\n");
  282.         while ((char)JOYGET(0) != (char)0xff) {
  283.             if (KFLUSHIO(0xff) == ' ') {
  284.                 Jflg = FALSE;
  285.                 break;
  286.             }
  287.         }
  288.     }
  289. }
  290.  
  291. /*
  292.     画面の真ん中にウィンドウを表示して、キーボードより
  293.     文字列を得る(メッセージ付)
  294.     find、fileload用…。
  295. */
  296. int
  297. getstr(struct INPPTR *inp, char *message, int inp_len)
  298. {
  299.  
  300.     int win_sx, win_sy, win_lx, win_ly, inp_sx, inp_sy, retval;
  301.  
  302.     win_sx = ((CWIDTH - (inp_len + 4)) / 2) & -2;
  303.     win_sy = 10;
  304.     win_lx = inp_len + 4;
  305.     win_ly = 5;
  306.  
  307.     inp_sx = win_sx + 2;
  308.     inp_sy = win_sy + 3;
  309.  
  310.  
  311.     /*
  312.     !    キーバッファをクリアしてからウィンドウを開く
  313.     */
  314.  
  315.     KFLUSHIO(0xff);
  316.     tbox_w2(win_sx, win_sy, win_sx + win_lx, win_sy + win_ly);    /* 外枠 */
  317.     tbox_w2(inp_sx, inp_sy, inp_sx + inp_len, inp_sy + 1);    /* 入力枠 */
  318.  
  319.     if (!(GMODE)) {
  320.         /*
  321.         !    変換ウィンドウのバックが見やすいように
  322.         !    メニューバー下を消す
  323.         */
  324.         fill(0, 496, GWIDTH - 1, 511, 2);
  325.         B_LOCATE(0, 31);
  326.         B_ERA_AL();
  327.     }
  328.     B_LOCATE(win_sx + 2, win_sy + 1);
  329.     B_COLOR(3);
  330.     B_PRINT(message);
  331.  
  332.     B_CONSOL(inp_sx << 3, inp_sy << 4, inp_len + 3 - 1, 1 - 1);
  333.     OS_CURON();
  334.  
  335.     /*
  336.     !    文字入力
  337.     */
  338.     inp->max = inp_len;
  339.     retval = GETSS(inp);    /* 入力:retval==入力文字数 */
  340.     ASK_Window_Close();    /* 日本語ウィンドウを消す */
  341.     Init_Under_Bar();    /* メニューバー下を復活する */
  342.     OS_CUROF();
  343.  
  344.  
  345.     /*
  346.     !    画面の復帰
  347.     */
  348.     B_CONSOL(0, 0, 128 - 1, 64 - 1);
  349.     {
  350.         int i;
  351.  
  352.         for (i = win_sy - 2; i <= win_sy + win_ly; i++) {
  353.             p_lin(lp + i, i);
  354.         }
  355.     }
  356.  
  357.     return (retval);
  358. }
  359.  
  360.  
  361. /*
  362.     マウスボタンが離されるのを待つ
  363. */
  364. void 
  365. wait_mb_off()
  366. {
  367.     int x, y, l, r;
  368.  
  369.     do {
  370.         dmsstat(&x, &y, &l, &r);
  371.         dmspos(&x, &y);
  372.         p_time(0);
  373.     } while (l || r);
  374. }
  375.  
  376.  
  377. /*
  378.     チャイルドプロセスから帰る時、
  379.     クリックをうながすメッセージを出す
  380. */
  381. void 
  382. w_wait2()
  383. {
  384.     int dx, dy, bl, br;
  385.  
  386.     OS_CUROF();
  387.     KFLUSHIO(-1);
  388.     do {
  389.         dmsstat(&dx, &dy, &bl, &br);
  390.     } while (bl || br);
  391. #define    NO_WAIT_CLICK    \
  392.     (debugMode && ((B_SFTSNS() & (LED_CODEIN | LED_ROMA | LED_KANA)) > LED_CODEIN))
  393.     if (NO_WAIT_CLICK)
  394.         return;
  395.  
  396.     w_wait2_sub(1);
  397.     do {
  398.         dmsstat(&dx, &dy, &bl, &br);
  399.         if (space_on() || NO_WAIT_CLICK) {
  400.             bl = TRUE;
  401.             KFLUSHIO(-1);
  402.         }
  403.         if (dx || dy || !bl && !br && kbhit() || stick(1)) {
  404.             w_wait2_sub(1);
  405.             while (kbhit()) {
  406.                 INPOUT(0xff);
  407.             }
  408.         } else {
  409.             w_wait2_sub(0);
  410.         }
  411.     } while (!bl && !br);
  412.     do {
  413.         dmsstat(&dx, &dy, &bl, &br);
  414.     } while (bl || br);
  415.     B_PRINT("\r\r");
  416. }
  417.  
  418.  
  419. static void 
  420. w_wait2_sub(int initf)
  421. {
  422.     static int et, dspf, count;
  423.  
  424.     if (initf) {
  425.         dspf = 1;
  426.         count = 14;        /* 明滅回数(1明or1滅毎にcount down) */
  427.         et = init_et(120);    /* 最初の1.2秒は普通に表示 */
  428.         w_wait2_prt(dspf);
  429.         return;
  430.     }
  431.  
  432.     if (et > d_ontime()) {
  433.         return;
  434.     }
  435.     if (count < 0) {
  436.         return;
  437.     }
  438.  
  439.     et = init_et(7);        /* 約0.07秒ごと明滅 */
  440.     count--;
  441.     dspf = 1 - dspf;
  442.     w_wait2_prt(dspf);
  443.     return;
  444. }
  445.  
  446. static void 
  447. w_wait2_prt(int display_f)
  448. {
  449.     if (display_f) {
  450.         B_COLOR(5);
  451.         B_PRINT("\rマウスを『クリック』するとシェルに戻ります\r");
  452.         B_COLOR(3);
  453.     } else {
  454.         B_ERA_AL();    /* 行末まで消去 */
  455.     }
  456. }
  457.  
  458.  
  459. /*
  460.     ONTIME()+wait(1/100sec) 分の時間を返す
  461. */
  462. asm("
  463. _init_et::
  464.     moveq.l    #$7f,d0        *ONTIME
  465.     trap    #15
  466.     add.l    4(sp),d0
  467.     cmpi.l    #24*60*60*100,d0
  468.     bcs    @f
  469.     subi.l    #24*60*60*100,d0
  470.     addq.w    #1,d1
  471.     bra    @f
  472.  
  473. _d_ontime::    *上位バイトに 0~127 の日情報を入れて返す ONTIME()
  474.     moveq.l    #$7f,d0        *ONTIME
  475.     trap    #15
  476. @@:    move.l    d0,-(sp)
  477.     andi.b    #$7f,d1
  478.     move.b    d1,(sp)
  479.     move.l    (sp)+,d0
  480.     rts
  481. ");
  482.  
  483. /*
  484.     日本語変換ウィンドウを閉じる
  485. */
  486. static void 
  487. ASK_Window_Close(void)
  488. {
  489.     asm("
  490.     pea    0.w
  491.     move.l    #1,-(sp)
  492.     dc.w    $FF22        *FPコール番号1番(knjctrl)
  493.     addq.l    #8,sp");
  494. }
  495.  
  496.  
  497. /*
  498.     そのドライブ(drv:'A'~'Z')が
  499.     準備OKだったらTRUE、準備できてなかったらFALSEを返す
  500. */
  501. int
  502. drvready(char drv)
  503. {
  504.     drv = toupper(drv);
  505.     if (drv >= 'A' && drv <= 'Z') {
  506.         return (DRVCTRL(0, drv - '@') & 0x04) ? FALSE : TRUE;
  507.     } else {
  508.         return FALSE;
  509.     }
  510. }
  511.  
  512.  
  513.  
  514. /*
  515.     テキストマルチプレーン同時アクセスをセットしちまう
  516.     CRTCじかいじり
  517.     使った後はさっさと元に戻すこと
  518.  
  519.     pl:テキストプレーン 0~3 のうち使用したいビットを立てて渡す
  520.        ただし 0 の時はマルチプレーンアクセスをやめる
  521.        0 か 3 以外を渡されると画面がヘンになるかもしれない…
  522.  
  523.     v3.30
  524.         pl < 0 なら IOCS の文字描画色に対応するプレーンを採用
  525.         pl = 0 ならシステム既定値にリセット
  526.         CRTC R21 の他のビットは保存しない
  527. */
  528. void
  529. tcolor(char pl)
  530. {
  531.     if (pl == 0) {
  532.         B_WPOKE(CRTCR21, 0x0033);
  533.     } else {
  534.         if (pl < 0)
  535.             curColor = pl = B_COLOR(-1) & 0x03;
  536.         pl &= 0x0f;
  537.         B_WPOKE(CRTCR21, (pl << 4) | 0x0100);
  538.     }
  539. }
  540.  
  541.  
  542. /*
  543.     Human68k標準の文字属性変更エスケープシーケンスかどうかチェックする
  544.     入力:文字列の0x1bの次位置を指すポインタ
  545.     戻値:エスケープシーケンス部分の長さ(0x1b除く)、エスケープシーケンスでなかった場合0
  546.  
  547.     v3.30:
  548.         ESC[~m 以外に ESC[~C, ESC[~D (カーソル桁位置相対移動) も通す
  549. */
  550. uchar escNumBuff[7 + 1];
  551.  
  552. int
  553. isEscSeq(const uchar *p)
  554. {
  555.     static const char escNum[] = {
  556. //           0     1     2     3     4     5     6     7     8     9
  557.         0x03, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00,    // 0
  558.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    // 10
  559.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,    // 20
  560.         0x40, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00,    // 30
  561.         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00,    // 40
  562.     };
  563.     uchar c, cc, *q;
  564.     const uchar *startp = p;
  565.  
  566.     if (*p++ != '[')
  567.         return 0;
  568.  
  569.     q = escNumBuff;
  570.     cc = curColor;
  571.     for (;;) {
  572.         c = *p++;
  573.         switch (c) {
  574.         case ' ':
  575.         case '\t':
  576.         case '\r':
  577.             continue;
  578.         case ';':
  579.         case 'm':
  580.             *q = '\0';
  581.             if (q > escNumBuff) {
  582.                 int j;
  583.                 signed char f;
  584.  
  585.                 j = atoi(q = escNumBuff);
  586.                 if (j < 50) {
  587.                     f = escNum[j];
  588.                     if (f < 0)
  589.                         cc ^= (f & 0x0f);
  590.                     else if (f != 0)
  591.                         cc = (f & 0x0f);
  592.                 }
  593.             } else
  594.                 cc = 0x03;
  595.             if (c == ';')
  596.                 continue;
  597.             curColor = cc;
  598.             return p - startp;
  599.         case 'C':
  600.         case 'D':
  601.         case 'e':
  602.         case 'x':
  603.             *q = '\0';
  604.             return p - startp;
  605.         default:
  606.             if (c <= '9' && c >= '0') {
  607.                 *q++ = c;
  608.                 if (q - escNumBuff >= 7) {    // IOCS の文字表示ルーチンは数字列の頭 7 文字しか見ない
  609.                     while ((c = *p++) <= '9' && c >= '0'
  610.                       || c == ' ' || c == '\t' || c == '\r')
  611.                         ;
  612.                     p--;
  613.                 }
  614.                 continue;
  615.             }
  616.             *q = '\0';
  617.             return 0;
  618.         }
  619.     }
  620. }
  621.  
  622.  
  623. /*
  624.     簡略版 filelength();
  625. */
  626. long
  627. dfilelength(int fno)
  628. {
  629.     long n, curPos;
  630.  
  631.     curPos = SEEK(fno, 0, SEEK_CUR);
  632.     if (curPos < 0)
  633.         return -1;
  634.     n = SEEK(fno, 0, SEEK_END);
  635.     SEEK(fno, curPos, SEEK_SET);
  636.  
  637.     return n;
  638. }
  639.  
  640.  
  641. /*
  642.     環境変数を定義し、親~全祖先プロセスに継承
  643. */
  644. void
  645. setenv_and_export(const uchar *name, const uchar *value)
  646. {
  647.     unsigned long *psp;
  648. #if 0
  649. 本来、自身がフォアグラウンドで動作していることを確認する必要がある
  650. (そうでないと、親プロセスが先に死んでいる可能性がある)が、省略
  651. #endif
  652.     for (psp = ((unsigned long *)_PSP) - 4; psp != NULL; psp = (unsigned long *)B_LPEEK(psp + 1)) {
  653.         uchar *env = (uchar *)B_LPEEK(psp + 4);
  654.         if ((int)env > 0)
  655.             SETENV(name, env, value);
  656.     }
  657. }
  658.